# 集合,区别与其他的数据容器. 集合 不支持重复数据且无序的(每次随机排列数据),且集合不能嵌套
# 集合定义
集合 = {0, 0, 1, 1, 2, 3, '孙', 4, 5, 6, 's', 'a'}  # 集合是用 大括号 表示
空集合1 = set()   # 一个空集合
空集合2 = {}  # 注意 这种不是集合类型了
print(f'集合不会显示重复数据,且每次随机排列数据,:{集合},类型是{type(集合)}')
print(f'空集合1: {空集合1} ,类型是{type(空集合1)}')
print(f'空集合2: {空集合2} ,类型是{type(空集合2)},\n')

# 集合不支持下标索引,因为它是无序的. 特别注意

# 集合添加元素
集合 = {0, 0, 1, 1, 2, 6, '孙', 's', 'a'}
集合.add('新罡')   # 添加元素,进入集合
print(f'添加了"新罡"元素的集合是: {集合}')

# 删除指定元素
集合.remove('a')
print(f'删除了"a"元素的集合是:  {集合}\n')

# 随机取一个元素,可以存到别处. 原集合这个元素删除
新集合 = {'孙', '新', '罡', 'sxinging'}
元素 = 新集合.pop()  # 随机取的数据存到另一个变量里
print(f'随机删除了 {元素} 元素数据,新集合现在是:  {新集合}')

# 清空集合
新集合.clear()  # 清空集合里所以数据
print(f'清空集合,新集合现在是: {新集合}\n')

"""
集合有 差集 并集 交集 补集 ,运算除了函数 运算符也可以表示
差集 -  A - B  去除相同数据,注意是谁差谁
并集 |  A | B  合并全部数据
交集 &  A & B  去除不相同数据,留下相同的数据  注意是谁交谁
补集 ^  A ^ B  去除相同数据,合并不同的数据
"""

# 集合的差集
# 集合1和集合2的差集,(集合1有,而集合2没有的)
集合1 = {1, 2, 3}
集合2 = {1, 4, 5}
# 集合2 是参数,所以输出的是 集合1 的不同数据.  反之亦然
差集合 = 集合1.difference(集合2)   # 说白了就是比较2个集合,找出不同的值.输出存储到另一个集合里
print(f'集合1和集合2的差集(差异的数据)是:{差集合},类型都是:{type(差集合)}')
差集合 = 集合2.difference(集合1)
print(f'集合2和集合1的差集(差异的数据)是:{差集合}')

# 消除差集 在集合1里,删除与集合2相同的元素
# 注意: 差集 的操作是集合1被修改了,而集合2不变
集合1 = {1, 2, 3}
集合2 = {1, 4, 5}
# 集合2 是参数,所以修改的是集合1的数据. 反之亦然
集合1.difference_update(集合2)
print(f'集合1和集合2的消除差集(删除相同的数据),修改集合1后:{集合1}')
"""
差集和消除差集,其实是一样的. 只是一个不改变原来的数据,另外一个直接改变原来集合的数据了
差集其实就是比较集合,输出不相同的数据.相同的数据不要
"""

# 2个集合合并  合并成新给集合,2个原来的集合不变
# 2个集合的所有数据,新集合都有
集合1 = {1, 2, 3, "罡"}
集合2 = {1, 4, 5, "罡"}
新集合 = 集合1.union(集合2)  # 合并2个集合
print(f'2个集合,合并成为新集合:{新集合}')
print()

# 统计集合里元素的个数
集合 = {0, 0, 1, 1, '孙', 's', 'a'}
个数 = len(集合)
print(f'集合一共有 {个数} 个元素')  # 注意集合的数据不能重复,所以重复的 元素数据 是算一个

"""
集合的遍历
集合没有下标索引,所以不能用while循环
但是可以用for循环,遍历集合
"""
print("用for循环,遍历集合")
集合 = {0, 0, 1, 1, '孙', 's', 'a'}
for x in 集合:
    print(f'集合元素有:{x}')
print()
"""
黑马只教了,这个 差集 并集, 没有教 交集和补集 的函数  2023年2月21日
先记录到时补充
"""

# 集合的 交集, 和差集相反2个集合比较输出 相同的数据
集合1 = {1, 2, 3, "罡"}
集合2 = {1, 4, 5, "罡"}
交集合 = 集合1.intersection(集合2)
print(f'2个集合的交集 输出 相同的数据, 新集合是:{交集合}')

# 消除交集
集合1 = {1, 2, 3, "罡"}
集合2 = {1, 4, 5, "罡"}
# 和上面 消除差集 一样,交集也有类似的函数.  集合1和集合2 交集,直接修改集合1的数据
集合1.intersection_update(集合2)
print(f'2个集合的交集 输出 相同的数据,集合1被修改了:{集合1}')


# 集合的 补集
# 补集的函数 symmetric_difference
集合1 = {1, 2, 3, "罡"}
集合2 = {1, 4, 5, "罡"}
集合3 = {22}
# 补集是  合并不相同的数据保存在一起
补集合 = 集合1 ^ 集合2 ^ 集合3
print(f'2个集合的补集,合并不相同的数据保存在一起, 补集合是:{补集合}')


"""
集合有 差集 并集 交集 补集 ,运算除了函数 运算符也可以表示
差集 -  A - B  去除相同数据,注意是谁差谁
并集 |  A | B  合并全部数据
交集 &  A & B  去除不相同数据,留下相同的数据  
补集 ^  A ^ B  去除相同数据,合并不同的数据

集合除了这4种常见,还有很多 这里学习最基础的
"""
print()

# 差集  去除相同数据
# 特别注意差集有位置先后问题,因为位置不同输出数据不同,存在以谁为标准的问题
集合A = {1, 2, 3, "罡"}
集合B = {1, 4, 5, "罡"}
差集 = 集合A - 集合B  # 注意是谁差谁 输出的是前面的数据
print(f'集合A差集合B 是A差集的数据{差集}')
差集 = 集合B - 集合A
print(f'集合B差集合A 是B差集的数据{差集}')

# 并集 合并全部数据
并集 = 集合A | 集合B
print(f'集合B并集合A 合并2个集合全部的数据{并集}')

# 交集  去除不相同数据,留下相同的数据
交集 = 集合A & 集合B  # 要的都是相同的数据所以 位置随便输出数据但是一样
print(f'集合A交集合B 是A交集的数据{交集}')
交集 = 集合B & 集合A
print(f'集合B交集合A 是B交集的数据{交集}')

# 补集是  去除相同数据,合并不相同的数据保存在一起
# 补集 = 集合1 ^ 集合2
补集 = 集合1.symmetric_difference(集合2)
print(f'2个集合的补集,合并不相同的数据保存在一起, 补集合是:{补集}')


print('\n小练习')
# 小练习  去重列表的数据
练习列表 = ['孙', '新', '罡', '孙', '新', '罡']
# 可以直接把列表定义成为 集合,相同的 集合也可以定义成为其他类型
练习集合 = set(练习列表)
print(f'重新定义类型成为集合:{练习集合}')
# 上面的方法简便,我们现在的要求是有循环来搞
练习集合 = set()  # 空集合
for x in 练习列表:
    print(f'读取列表元素:{x},加到集合里')
    练习集合.add(x)
print(f'最后集合数据是:{练习集合}')
